home *** CD-ROM | disk | FTP | other *** search
Text File | 1995-03-13 | 986 b | 45 lines | [TEXT/Mrls] |
- /*
- fib-memo.dyl
-
- Example of memoization in Dylan.
-
- Credits to Bruce@hoult.actrix.gen.nz (Bruce Hoult) for add-method approach.
- <table> version by Patrick C. Beard <beard@cs.ucdavis.edu>.
- */
-
- define method fib-memo (n == 0) 1 end;
- define method fib-memo (n == 1) 1 end;
-
- define method fib-memo (n :: <integer>)
- let f = fib-memo (n - 2) + fib-memo (n - 1);
- add-method (fib-memo, method (n == n) f end);
- f
- end;
-
- // alternate approach.
-
- define constant $fib-memo-table$ = make (<table>);
- $fib-memo-table$[0] := 1;
- $fib-memo-table$[1] := 1;
-
- define method fib-table (n :: <integer>)
- let f = element ($fib-memo-table$, n, default: #f);
- if (~f)
- f := fib-table (n - 2) + fib-table (n - 1);
- $fib-memo-table$[n] := f;
- end if;
- f
- end method;
-
- define method memoize (f :: <function>)
- let f-table = make (<table>);
- method (n :: <integer>)
- let value = element (f-table, n, default: #f);
- if (~value)
- value := f (n);
- f-table[n] := value;
- end if;
- value
- end
- end method;
-